//
//  UIDevice+ZXHelper.h
//  YiShangbao
//
//  Created by simon on 2017/11/3.
//  Copyright © 2017年 com.Microants. All rights reserved.
//
// 简介：(1) UDID：UDID（Unique Device Identifier Description）是苹果IOS设备的唯一识别码，由40个字符的字母和数字组成。在iOS5中可以获取到设备的UDID，但在iOS7中已经完全的禁用了它。在Xcode菜单“Window” -- “Devices and Simulators”的Devices面板中查看手机的UDID,开发者内部安装应用限制设备的时候需要。通过Safari可获取UDID。
//（2）在运行iOS 14.5和iPadOS 14.5和更高版本的设备上，你的应用程序必须支持app Tracking Transparency和定义目的字符串NSUserTrackingUsageDescription，然后才能获得advertisingIdentifier属性。
// key:Privacy - Tracking Usage Description;  value:为了向您提供更优质的个性化服务和内容，如最新的店铺数据等，菜划算销售申请获取您的设备标识符（IDFA），未经您的同意，我们不会用于其他目的；开启后，您也可以前往”设置-隐私“中关闭;
//
//  2018.04.03  优化注释
//  2019.3.20  增加设备大体类型model方法
//  2020.02.04  注释
//  2020.5.25  更新获取设备名方法最新设备。
//  2020.11.21 更新iPhone12 期的各种设备名；
//  2021.05.17 增加zx_getUUIDFromKeychain，app Tracking Transparency权限请求获取；

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIDevice (ZXHelper)


/// 每次初始化后生成一个随机的UUID；格式如"E621E1F8-C36C-495A-93FC-0C247A3E6E5F”的字符串；
- (NSString *)zx_getUUID;


/**
 获取IDFV的UUID；
 每个APP根据bundleID（供应商）独立一个不同的ADFV，但相同bundleID的app，ADFV是相同的；注意：如果用户将属于此Vender(供应商-公司的bundleId)的所有App卸载，则IDFV的值会被重置，即再重装此Vender的App，IDFV的值和之前不同。F47873A0-B382-42CA-B863-F405B87E8682;
 */
- (NSString *)zx_getIDFV;



/// 目前解决方法：IDFV获取一次后，使用钥匙串保存起来，这样即使你删除了App，再重新安装，只有BundleId不变，那么从钥匙串中获取的UUID不会变的。
- (NSString *)zx_getUUIDFromKeychain;

/** 获取IDFA广告id标识符；
 IDFA是iOS 6.0系统新增广告标示符，适用于对外：例如广告推广，换量等跨应用的用户追踪等。
 在同一个设备上的所有App都会取到相同的值，是苹果专门给各广告提供商用来追踪用户而设的。
 形如：9C287922-EE26-4501-94B5-DDE6F83E1475。
 注意：用户完全重置系统（设置  -> 通用 -> 还原 -> 还原位置与隐私) ，这个广告标示符不会重新生成。亲测：iOS12以上根本不会重新生成。
 一般情况总是同一个值，但IDFA存在重新生成的情况:
 （1）iOS14之前：
   （1.1）用户开启了“限制广告跟踪”（设置 -> 隐私- > 广告 -> 限制广告跟踪）
  在iOS 10.0之前，会被重新生成一个新的。
  在iOS 10.0-iOS14，开启‘限制广告跟踪’功能， 则获取到的idfa为一个固定值00000000-0000-0000-0000-000000000000；每次开启再关闭，相应的idfa会重新生成一个全新的字符串。
   （1.2）用户点击“还原广告标示符”(设置 -> 隐私- > 广告 -> 还原广告标示符) ，那么广告标示符也会重新生成一个全新的字符串。
 注意：iOS14之前Apple默认是允许追踪的，而且一般用户都不知道有这么个设置，所以基本上用来监测推广效果。
 （3）iOS14之后，用跟踪。
  (4)advertisingIdentifier是一个字母数字字符串，对每个设备都是唯一的，并且只用于广告。此字符串用于频率封顶、归因、转换事件、估计唯一用户数量、广告欺诈检测和调试。在运行ios14.5及以上版本和iPadOS 14.5及以上版本的设备上，在第一次请求广告标识符之前，你的应用程序必须一次性调用requestTrackingAuthorizationWithCompletionHandler:。该方法将应用跟踪授权请求呈现给用户。用户可以选择是否允许跟踪，但可以在设置>隐私>跟踪中随时更改应用的授权。你可以通过trackingAuthorizationStatus检查应用的授权状态来确定用户的意图。只有第一次请求才会弹出授权提示窗。
 */
- (NSString *)zx_getIDFA;


/// 在运行iOS 14.5和iPadOS 14.5和更高版本的设备上，你的应用程序必须支持app Tracking Transparency和定义目的字符串NSUserTrackingUsageDescription；key:Privacy - Tracking Usage Description;  value:为了向您提供更优质的个性化服务和内容，如最新的店铺数据等，菜划算销售申请获取您的设备标识符（IDFA），未经您的同意，我们不会用于其他目的；开启后，您也可以前往”设置-隐私“中关闭;
+ (void)chs_requestTrackingAuthorization;

/// 获取mac地址
+ (nullable NSString *)zx_getMacAddress;


/// 获取ip地址,获取设备当前网络IP地址
/// @param preferIPv4 <#preferIPv4 description#>
+ (NSString *)zx_getIPAddress:(BOOL)preferIPv4;






// CPU总数目
+ (NSUInteger)zx_getCPUCount;
// CPU使用的总比例
+ (CGFloat)zx_getCPUUsage;
// 获取每个cpu的使用比例
+ (nullable NSArray *)zx_getPerCPUUsage;



/********内存空间*************/

// 系统总内存空间
- (int64_t)zx_getTotalMemory;
// 空闲的内存空间
- (int64_t)zx_getFreeMemory;

// 已使用的内存空间
- (int64_t)zx_getUsedMemory;

// 活跃的内存,正在使用或者很短时间内被使用过
- (int64_t)zx_getActiveMemory;

// 最近使用过,但是目前处于不活跃状态的内存
- (int64_t)zx_getInActiveMemory;

// 用来存放内核和数据结构的内存,framework、用户级别的应用无法分配
- (int64_t)zx_getWiredMemory;

// 可释放的内存空间：内存吃紧自动释放，针对大对象存放所需的大块内存空间
- (int64_t)zx_getPurgableMemory;

@end

NS_ASSUME_NONNULL_END

/************************获取设备常见信息***********************/
/*
// 获取设备用户的名称（iphone用户名称,mac用户名称,即自己写的名字）
NSString *iPhoneName = [UIDevice currentDevice].name;
NSLog(@"iPhone名称-->%@", iPhoneName);

// 获取设备的类型 @"iPhone", @"iPod touch"
NSString *model = [UIDevice currentDevice].model;
NSLog(@"设备类型model-->%@", model);

NSString *localizedModel = [UIDevice currentDevice].localizedModel;
NSLog(@"设备本地化模型localizedModel-->%@", localizedModel);

//获取设备的系统名称，iOS，Mac
NSString *systemName = [UIDevice currentDevice].systemName;
NSLog(@"当前系统名称-->%@", systemName);

// 获取设备的系统版本 @"4.0",@"11.0"
NSString *systemVersion = [[UIDevice currentDevice] systemVersion];
NSLog(@"当前系统版本号-->%@", systemVersion);

// 获取电量的等级，[0 ,1.0]，-1.0
CGFloat batteryLevel = [[UIDevice currentDevice] batteryLevel];
NSLog(@"电池电量-->%f", batteryLevel);

// 获取设备的电池当前状态：当发生改变时会发送通知
UIDeviceBatteryState batteryState = [[UIDevice currentDevice] batteryState];
NSLog(@"电池当前状态-->%ld", batteryState);



NSString *appVerion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSLog(@"app版本号-->%@", appVerion);
*/



